#define DOGZ_VERSION "2.0.0-alpha"

#include "dogz/Dogz.h"
#include "MessageDialog.h"
#include "DogzWindow.h"
#include "wizards/intro/IntroWizard.h"
#include <QtGui>
#include <QtSql>
#include <QApplication>


void initDatabase(const QString& dbFile);
void initDogz(QSplashScreen& splash);


int main(int argc, char *argv[])
{
    // Żeby poprawnie działały polskie litery
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));

    QApplication a(argc, argv);
    a.setOrganizationName("Zbigniew Siciarz");
    a.setApplicationName("DOGZ");
    a.setApplicationVersion(DOGZ_VERSION);

    QTranslator translator;
    translator.load(":/translations/translations/qt_pl.qm");
    a.installTranslator(&translator);

    QSettings settings;
    if (settings.value("firstRun", true).toBool() == true)
    {
        IntroWizard wizard;
        wizard.exec();
        settings.setValue("firstRun", false);
    }

    QPixmap pixmap(":/images/splash.png");
    QSplashScreen splash(pixmap);
    splash.setWindowFlags(splash.windowFlags() | Qt::WindowStaysOnTopHint);
    splash.show();
    a.processEvents();
    initDogz(splash);

    DogzWindow w;
    w.show();
    splash.finish(&w);
    w.raise();

    return a.exec();
}

/**
 * Inicjalizuje aplikację.
 *
 * @param splash obiekt splashscreena
 */
void initDogz(QSplashScreen& splash)
{
    // żeby działało przerzucanie obiektów Star przez sygnały i sloty
    qRegisterMetaType<Dogz::Star>();

    QSettings settings;
    QString validationFile = QDir::cleanPath(qApp->applicationDirPath() +
            settings.value("validationFile", "/validation.txt").toString());
    QString dbFile = QDir::cleanPath(qApp->applicationDirPath() +
           "/db/database.db");

   try
   {
       splash.showMessage("Wczytywanie pliku walidacji...",
               Qt::AlignHCenter | Qt::AlignBottom, Qt::white);
       qApp->processEvents();
       Dogz::StarManager::loadValidationFile(validationFile);

       splash.showMessage("Inicjalizacja bazy danych...",
               Qt::AlignHCenter | Qt::AlignBottom, Qt::white);
       qApp->processEvents();
       initDatabase(dbFile);
   }
   catch(Dogz::FileException& e)
   {
       MessageDialog::exception(e);
   }
   catch (Dogz::DbException& e)
   {
       MessageDialog::exception(e);
   }
}

/**
 * Inicjalizacja bazy danych.
 *
 * Łączy z bazą SQLite zawartą w podanym pliku, a jeli taki nie istnieje,
 * to zostaje utworzony i wypełniony strukturą tabel.
 *
 * @param dbFile pełna ścieżka do pliku zawierającego bazę
 */
void initDatabase(const QString& dbFile)
{
    bool dbExists = QFile::exists(dbFile);

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(dbFile);
    if (!db.open())
        throw Dogz::DbException(db.lastError().text());

    // przy pierwszym uruchomieniu tworzymy tabele
    if (!dbExists)
    {
        Dogz::StarManager::createStarsTable();
        Dogz::ObservationManager::createTables();
    }
}
